#include "TaskQueue.hpp"

namespace xkk
{

TaskQueue::TaskQueue(size_t size)
:_queSize(size)
    ,_que()
    ,_mutex()
    ,_notFull(_mutex)
    ,_notEmpty(_mutex)
    ,_flag(true)
    {}

bool TaskQueue::full() const
{
    return _que.size()==_queSize;
}

bool TaskQueue::empty() const
{
    return _que.size()==0;
}

void TaskQueue::push(ElemType elem)
{
    MutexLockGuard autolock(_mutex);
    while(full()){
        _notFull.wait();
    }
    _que.push(elem);
    _notEmpty.notify();
}

ElemType TaskQueue::pop()
{
    MutexLockGuard autolock(_mutex);
    while(_flag&& empty()){
        _notEmpty.wait();
    }

    if(_flag){
        ElemType elem=_que.front();
        _que.pop();
        _notFull.notify();
        return elem;
    }
    else{
        return nullptr;
    }
}

void TaskQueue::wakeup()
{
    if(_flag){
        _flag=false;
    }
    _notEmpty.notifyAll();
}

}//end of namespace xkk
